//
//  ZPHomeTController.swift
//  weibo
//
//  Created by zhangpeng on 16/4/16.
//  Copyright © 2016年 zhangpeng. All rights reserved.
//

import UIKit
// cell可重用标识
private let HomeTableViewCellIdentifierId = "HomeTableViewCellIdentifierId"

class ZPHomeTController: ZPTVisitorTController {

    // 保存微博数据数组
    var status: [ZPStatus]?
    
    override func viewDidLoad() {
        super.viewDidLoad()

        if !isLogin{
        
            visitorView?.setVisitorInfo(nil, title: nil)
            return
        }
        setupUI()
        setupTableViewInfo()
        
        // 请求微博首页数据
        demo{[weak self](statuss) ->()in
            
             // 01-赋值
            self?.status = statuss
              // 02-刷新UI
          self?.tableView.reloadData()
        }
        
        loadData(indicatorView.isAnimating())

    }

    private func setupTableViewInfo(){
        
        // 注册cell
        tableView.registerClass(ZPStatusCell.self, forCellReuseIdentifier: HomeTableViewCellIdentifierId)
        // 设置cell高度
        // UITableViewAutomaticDimension 自动计算行高
        tableView.rowHeight = UITableViewAutomaticDimension
        
        tableView.estimatedRowHeight = 200
        
        //tableView.rowHeight = 200
        //设置风格
        tableView.separatorStyle = .None
        
         // 设置tablView 的footView
         tableView.tableFooterView = indicatorView
        
        //添加下拉刷新控件
        tableView.addSubview(refresh)
        //
        refresh.addTarget(self, action: "refreshAction", forControlEvents: UIControlEvents.ValueChanged)
        
    }
    
        // MARK: -  设置视图
    private func setupUI(){
    
        navigationController?.view.insertSubview(showCountLabel, belowSubview: (navigationController?.navigationBar)!)
        
        showCountLabel.frame = CGRect(x: 0, y: 64 - 34, width: SCREENW, height: 34)
    }
    
    
    // 下拉刷新调用方法
    @objc private func refreshAction(){
    
        loadData(indicatorView.isAnimating())
    }
    
    // MARK: -  懒加载控件  菊花
    private lazy var indicatorView : UIActivityIndicatorView = {
    
        let view = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
        // 设置菊花颜色
        view.color = ThemeColor
        
        return view
    
    }()
    //继承系统的下拉刷新控件
    private lazy var refresh:ZPRefreshControl = ZPRefreshControl()
    // 显示得到多少条数据label
    private lazy var showCountLabel:UILabel = {
        
        let lab = UILabel(textColor: UIColor.whiteColor(), textFont: 14)
        lab.textAlignment = .Center
        lab.backgroundColor = ThemeColor
        lab.text = "显示微博条数文字"
        lab.hidden = true
        return lab
        }()
}

extension ZPHomeTController{

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return status?.count ?? 0
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        // 方法02 -  我们通过标识到缓存中取 如果取不到 系统帮我们创建一个cell 前提: 需要我们程序员自己注册cell
        // 性能高于我们第一种方法
        
        let cell = tableView.dequeueReusableCellWithIdentifier(HomeTableViewCellIdentifierId, forIndexPath: indexPath)as! ZPStatusCell
        
        cell.status = status![indexPath.row]
        
       // cell?.backgroundColor = RandomColor()
     //这里留一个问题
        return cell
  
    }
    
    //当cell滚动到最后一条数据的时候，加载更多数据
    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        
        // 判断我们是否已经滑动到tableView 最底部
        // 防止用户在我们网络请求的时候 多次滑动 多次发送请求 加一个条件 只有菊花没有动画的时候在执行
        if indexPath.row == status!.count - 1 && !indicatorView.isAnimating(){
        
            // 设置动画
            indicatorView.startAnimating()
            loadData(indicatorView.isAnimating())
        }
    }
    
}

// MARK: - 加载更多数据
extension ZPHomeTController{

    func loadData(isPullUp:Bool){
    
        var sinceId:Int64 = 0
        var maxId:Int64 = 0
        
        //判断是上拉加载更多还是下拉刷新数据
        if isPullUp{
        
            sinceId = 0
            maxId = status!.last?.id ?? 0
            // 如果不判断 会返回来重复数据
            if maxId > 0{
            
                maxId = maxId - 1
            }
        }else{
 
            // 下拉刷新
            sinceId = status?.first?.id ?? 0
            maxId = 0
        }
        
        CZNetworkTools.sharedTools.loadStatus(ZPUserAccountTools.sharedTools.accessToken!, since_id: sinceId, max_id: maxId) { (response, error) -> () in
            
            self.endRefreshing()
            
            if error != nil{
                print(error)
                return
            }
            
            // 判断我们的得到的数据是否存在 而且是否是一个数组
            guard let array = response?["statuses"] as? [[String: AnyObject]] else{
                print("返回的数据不是一个数组")
                return
            }
            
            // 定义一个临时数组
            var tempArray:[ZPStatus] = [ZPStatus]()
            
            // 遍历数组 转模型
            for dict in array{
                
                let status = ZPStatus(dict: dict)
                  // 往数组中添加模型
                tempArray.append(status)
            }
            // 上拉加载更多
            if isPullUp{
            
                self.status! = self.status! + tempArray
            }else{
            
                // 下拉刷新
                self.status! = tempArray + self.status!
                
                 // 如果我们showCountLabel 已经显示了 不应再执行动画了
                if self.showCountLabel.hidden == true {
                
                    self.setShowCountLabelAnim(tempArray.count)
                }
            }
            
              // 刷新UI
            self.tableView.reloadData()
        }
        
    }
     // 停止动画方法
    func endRefreshing(){
    
        self.indicatorView.stopAnimating()
        self.refresh.endRefreshing()
    }
    
    
    func setShowCountLabelAnim(count:Int){
    
        showCountLabel.hidden = false
        /*
        - 如果count == 0 已经是最新的微博了
        - 如果count != 0 您更新了count条微博
        */
        var countString = ""
        if count == 0{
        
            countString = "您已经是最新的微博了"
        }else{
        
            countString = "您更新了\(count)条微博"
        }
        
        //设置text
        showCountLabel.text = countString
        
        UIView.animateWithDuration(1, animations: { () -> Void in
            
            self.showCountLabel.frame.origin.y = 64
            }) { (_) -> Void in
                UIView.animateKeyframesWithDuration(1, delay: 1, options: [], animations: { () -> Void in
                    self.showCountLabel.frame.origin.y = 64 - 34
                    }, completion: { (_) -> Void in
                    self.showCountLabel.hidden = true
                })
        }
    }
    
}


// MARK : - 请求网络数据
extension ZPHomeTController{

    func demo(callback:(statuss:[ZPStatus])->()){
    //请求URL
    let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
    
        let params = ["access_token":ZPUserAccountTools.sharedTools.accessToken!]
        
        CZNetworkTools.sharedTools.request(CZRequestMethod.GET, urlString: urlString, params: params) { (response, error) -> () in
            
            if error != nil{
                print(error)
                return
            }
            
            // 判断我们的得到的数据是否存在 而且是否是一个数组
            guard let array = response?["statuses"] as? [[String: AnyObject]] else{
                print("返回的数据不是一个数组")
                return
            }
            
            // 定义一个临时数组
            var tempArray:[ZPStatus] = [ZPStatus]()
            
             // 遍历数组 转模型
            for dict in array{
            
                let status = ZPStatus(dict: dict)
                
                tempArray.append(status)
            }
            
            callback(statuss: tempArray)
            
        }
        
    }
    
}